from django.shortcuts import render
from django.views import View
from areas.models import Area
from django.http import JsonResponse
from django.core.cache import cache


class ProvinceAreasView(View):
    """省级地区"""

    def get(self, request):
        """提供省级地区数据
        1.查询省级数据
        2.序列化省级数据
        3.响应省级数据
        """

        # TODO: 通读策略step1 —— 先读缓存
        province_list = cache.get("province_list")  # 返回缓存数据 或 None
        if province_list is None:  # 缓存未命中
            # TODO: 通读策略step2 —— 读mysql
            try:
                # 1.查询省级数据
                provinces = Area.objects.filter(parent=None)
                # 2.整理省级数据
                province_list = []
                for province in provinces:
                    # print(provinces, province.id, province.name)
                    province_list.append({
                        "id": province.id,
                        "name": province.name,
                    })
            except Exception as e:
                # 如果报错, 则返回错误原因:
                return JsonResponse({'code': 400, 'errmsg': '省份数据错误'})
            # TODO: 通读策略step3 —— 缓存回填
            cache.set('province_list', province_list, 3600)  # 3600秒为缓存数据的有效期

        # 3.返回整理好的省级数据
        return JsonResponse({'code': 0, 'errmsg': 'OK', 'province_list': province_list})


class SubAreasView(View):
    """子级地区：市和区县"""

    def get(self, request, pk):
        """提供市或区地区数据
        1.查询市或区数据
        2.序列化市或区数据
        3.响应市或区数据
        """

        # TODO: 通读策略step1 —— 读缓存
        sub_data = cache.get("sub_area_%s" % pk)
        if sub_data is None:    # 缓存未命中
            # TODO: 通读策略step2 —— 读mysql
            try:
                # 1.通过模型类，查询省份数据
                area = Area.objects.get(id=pk)
                # 1.1 获取子级行政区数据(市或区)
                # subs = Area.objects.filter(parent=pk)     # 方法一
                # subs = area.area_set.all()              # 方法二：查询集，里面都是子级别行政区Area对象(默认写法)
                subs = area.subs.all()                    # 方法二：模型类中外键有设定related_name="subs"的写法，覆盖默认

                # 2.整理市或区数据
                sub_list = []
                for sub in subs:
                    sub_list.append({
                        "id": sub.id,
                        "name": sub.name,
                    })
                sub_data = {
                    "id": area.id,
                    "name": area.name,
                    "subs": sub_list
                }
            except Exception as e:
                return JsonResponse({'code': 400, 'errmsg': '城市或区县数据错误'})

            # TODO: 通读策略step3 —— 回填缓存
            # 如下，表示缓存数据是id为110000省的子级行政区数据
            # set  sub_area_110000  {'id': parent.id,'name': parent.name,'subs': subs_list}
            cache.set("sub_area_%s" % pk, sub_data, 3600)   # 3600秒为缓存数据的有效期

        # 3.响应市或区数据
        return JsonResponse({'code': 0, 'errmsg': 'OK', 'sub_data': sub_data})
